package tbs.framework.async.container.model;

import lombok.Getter;
import org.jetbrains.annotations.NotNull;
import tbs.framework.async.task.IAsyncTask;
import tbs.framework.async.task.ICancelable;
import tbs.framework.async.task.IProgressable;
import tbs.framework.async.task.IResultable;
import tbs.framework.utils.BeanUtil;

/**
 * 异步任务详情类，用于封装异步任务并提供其进度、取消和结果的相关信息。
 *
 * @author Abstergo
 */
@Getter
public class AsyncTaskDetail {

    private final IAsyncTask task;

    private final IProgressable progressable;

    private final ICancelable cancelable;

    private final IResultable resultable;

    /**
     * 判断任务是否支持进度跟踪。
     *
     * @return 如果任务支持进度跟踪则返回true，否则返回false。
     */
    public boolean isProgressable() {
        return progressable != null;
    }

    /**
     * 判断任务是否支持取消。
     *
     * @return 如果任务支持取消则返回true，否则返回false。
     */
    public boolean isCancelable() {
        return cancelable != null;
    }

    /**
     * 判断任务是否支持结果获取。
     *
     * @return 如果任务支持结果获取则返回true，否则返回false。
     */
    public boolean isResultable() {
        return resultable != null;
    }

    /**
     * 构造函数，通过IAsyncTask实例初始化异步任务详情。
     *
     * @param task IAsyncTask的实例，代表一个异步任务。
     */
    public AsyncTaskDetail(@NotNull IAsyncTask task) {
        this.task = task;
        // 通过BeanUtil工具类检测任务是否支持进度跟踪、取消和结果获取
        this.progressable = BeanUtil.getIfBase(task, IProgressable.class);
        this.cancelable = BeanUtil.getIfBase(task, ICancelable.class);
        this.resultable = BeanUtil.getIfBase(task, IResultable.class);
    }

    /**
     * 获取任务ID。
     *
     * @return 任务的唯一标识符。
     */
    public String getTaskId() {
        return task.taskId();
    }
}
